UNDERLINE "_"
NUMERO   [0-9]
LETRA    [A-Za-z_]

CTE_INT  {NUMERO}+
CTE_BOOL_TRUE [Vv][Ee][Rr][Dd][Aa][Dd][Ee][Ii][Rr][Oo]
CTE_BOOL_FALSE [Ff][Aa][Ll][Ss][Oo]
CTE_FLOAT {NUMERO}+"."{NUMERO}+
CTE_STRING "'"[^\n']*"'"  
CTE_CHAR "'"."'"

CIN	">->"
COUT	"<-<"

INTEIRO ([Ee][Mm]{UNDERLINE}[Ii][Nn][Tt][Ee][Ii][Rr][Oo][Ss])
FLOAT ([Ee][Mm]{UNDERLINE}[Rr][Ee][Aa][Ii][Ss])
STRING ([Ee][Mm]{UNDERLINE}[Ss][Ii][Mm][Bb][Oo][Ll][Oo][Ss])
CHAR ([Ee][Mm]{UNDERLINE}[Ss][Ii][Mm][Bb][Oo][Ll][Oo])
BOOL ([Ee][Mm]{UNDERLINE}[Ll][Oo][Gg][Ii][Cc][Oo][Ss])

ABREPARENTESE "("
FECHAPARENTESE ")"
ABRECHAVE "{"
FECHACHAVE "}"
COMECA [Ff][Aa][Cc][Aa]
FIM	[Ff][Ii][Mm]

VERDADE [Vv][Ee][Rr][Dd][Aa][Dd][Ee]
CONTRARIO [Cc][Oo][Nn][Tt][Rr][Aa][Rr][Ii][Oo]

IMPLICA "->"

SOMATORIO [Ss][Oo][Mm][Aa][Tt][Oo][Rr][Ii][Oo]
DE	[Dd][Ee]
ENQUANTO	[Ee][Nn][Qq][Uu][Aa][Nn][Tt][Oo]
PASSO	[Pp][Aa][Ss][Ss][Oo]
SEMPRE [Ss][Ee][Mm][Pp][Rr][Ee]
QUE	[Qq][Uu][Ee]
CASO [Cc][Aa][Ss][Oo]
SEJA [Ss][Ee][Jj][Aa]
FIMCOMANDO ";"

ELEMENTOS [Ee][Ll][Ee][Mm][Ee][Nn][Tt][Oo][Ss]
ALGORITMO [Aa][Ll][Gg][Oo][Rr][Ii][Tt][Mm][Oo]
FUNCOES [Ff][Uu][Nn][Cc][Oo][Ee][Ss]

RETURN "<-"

ATRIB "<=>" 
VIRGULA ","
AND      "/\\"
OR       "\/"
NOT      "~"
DIF      "~="
MAIG     ">="
MEIG     "<=" 
MAIOR    ">"
MENOR    "<"
IGUAL    "="
MAIS     "+"
MENOS    "-"
MULTIPLICACAO    "*"
DIVISAO         "/"
RESTO        "%"

ID       {LETRA}({LETRA}|{NUMERO})*

%%

{CTE_INT}   	{ rastreiaToken(yytext, "I", "CTE_INT"); return _CTE_INT; }
{CTE_BOOL_TRUE} { rastreiaToken("true", "B", "CTE_BOOL"); return _CTE_BOOL; }
{CTE_BOOL_FALSE} { rastreiaToken("false", "B", "CTE_BOOL"); return _CTE_BOOL; }
{CTE_FLOAT}  	{ rastreiaToken(yytext, "D", "CTE_FLOAT"); return _CTE_FLOAT; }
{CTE_CHAR}  	{ rastreiaToken(yytext, "C", "CTE_CHAR"); return _CTE_CHAR; }
{CTE_STRING}  	{ rastreiaToken(yytext, "S", "CTE_STRING"); return _CTE_STRING; }

{RETURN}	{ rastreiaToken(yytext, "", "RETURN"); return _RETURN; }

{INTEIRO}     	{ rastreiaToken(yytext, "I", "INTEIRO"); return _INTEIRO; }
{STRING}      	{ rastreiaToken(yytext, "S", "STRING"); return _STRING; }
{FLOAT}	      	{ rastreiaToken(yytext, "D", "FLOAT"); return _FLOAT; }
{CHAR}	      	{ rastreiaToken(yytext, "C", "CHAR"); return _CHAR; }
{BOOL}	      	{ rastreiaToken(yytext, "B", "BOOL"); return _BOOL; }

{CIN}	      	{ rastreiaToken(yytext, "", "CIN"); return _CIN; }
{COUT}	      	{ rastreiaToken(yytext, "", "COUT"); return _COUT; }

{ABREPARENTESE} 	{ rastreiaToken(yytext, "", "ABREPARENTESE"); return _ABREPARENTESE; }
{FECHAPARENTESE}	{ rastreiaToken(yytext, "", "FECHAPARENTESE"); return _FECHAPARENTESE; }
{ABRECHAVE} 	{ rastreiaToken(yytext, "", "ABRECHAVE"); return _ABRECHAVE; }
{FECHACHAVE} 	{ rastreiaToken(yytext, "", "FECHACHAVE"); return _FECHACHAVE; }
{COMECA}      	{ rastreiaToken(yytext, "", "COMECA"); return _COMECA; }
{FIM}         	{ rastreiaToken(yytext, "", "FIM"); return _FIM; }

{VERDADE}     	{ rastreiaToken(yytext, "", "VERDADE"); return _VERDADE; }
{CONTRARIO}   	{ rastreiaToken(yytext, "", "CONTRARIO"); return _CONTRARIO; }

{IMPLICA}	{ rastreiaToken(yytext, "", "IMPLICA"); return _IMPLICA; }

{SEMPRE}	{ rastreiaToken(yytext, "", "SEMPRE"); return _SEMPRE; }
{SOMATORIO}	{ rastreiaToken(yytext, "", "SOMATORIO"); return _SOMATORIO; }
{DE}		{ rastreiaToken(yytext, "", "DE"); return _DE; }
{ENQUANTO}	{ rastreiaToken(yytext, "", "ENQUANTO"); return _ENQUANTO; }
{PASSO}		{ rastreiaToken(yytext, "", "PASSO"); return _PASSO; }
{QUE}		{ rastreiaToken(yytext, "", "QUE"); return _QUE; }
{CASO}        	{ rastreiaToken(yytext, "", "CASO"); return _CASO; }
{SEJA}        	{ rastreiaToken(yytext, "", "SEJA"); return _SEJA; }
{FIMCOMANDO} 	{ rastreiaToken(yytext, "", "FIMCOMANDO"); return _FIMCOMANDO; }

{ELEMENTOS}   	{ rastreiaToken(yytext, "", "ELEMENTOS"); return _ELEMENTOS; }
{ALGORITMO}   	{ rastreiaToken(yytext, "", "ALGORITMO"); return _ALGORITMO; }
{FUNCOES}     	{ rastreiaToken(yytext, "", "FUNCOES"); return _FUNCOES; }

{ATRIB} 	{ rastreiaToken(yytext, "", "ATRIB"); return _ATRIB; }
{VIRGULA} 	{ rastreiaToken(yytext, "", "VIRGULA"); return _VIRGULA; }
{AND}       	{ rastreiaToken(yytext, "", "AND"); return _AND; }
{OR}        	{ rastreiaToken(yytext, "", "OR"); return _OR; }
{NOT}       	{ rastreiaToken(yytext, "", "NOT"); return _NOT; }
{DIF}        	{ rastreiaToken(yytext, "", "DIF"); return _DIF; }
{MAIG}        	{ rastreiaToken(yytext, "", "MAIG"); return _MAIG; }
{MEIG}       	{ rastreiaToken(yytext, "", "MEIG"); return _MEIG; }
{MAIOR}	    	{ rastreiaToken(yytext, "", "MAIOR"); return _MAIOR; }
{MENOR}       	{ rastreiaToken(yytext, "", "MENOR"); return _MENOR;}
{IGUAL}         { rastreiaToken(yytext, "", "IGUAL"); return _IGUAL;}
{MAIS}     	{ rastreiaToken(yytext, "", "MAIS"); return _MAIS; }
{MENOS}    	{ rastreiaToken(yytext, "", "MENOS") ; return _MENOS; }
{MULTIPLICACAO} { rastreiaToken(yytext, "", "MULTIPLICACAO"); return _MULTIPLICACAO; }
{DIVISAO}  	{ rastreiaToken(yytext, "", "DIVISAO"); return _DIVISAO; }
{RESTO}    	{ rastreiaToken(yytext, "", "RESTO"); return _RESTO; }

[\n]          	{ numLinha++; numCol = 0; ultimaLinha = ""; }

{ID}          	{ rastreiaToken(yytext, "", "ID"); return _ID; }
%%
